package com.nuotu.datawall.clouddata.control;

import android.content.Context;
import android.content.Intent;

import com.nuotu.datawall.clouddata.util.LogCook;
import com.nuotu.datawall.clouddata.util.Tool;


public class CrashHandler implements Thread.UncaughtExceptionHandler {

    private static CrashHandler crashHandler = new CrashHandler();
    private Context mContext;
    private Thread.UncaughtExceptionHandler mDefaultCaughtExceptionHandler;

    //使用饿汉单例模式
    public static CrashHandler getInstance() {
        return crashHandler;
    }

    public void init(Context context) {
        //获取默认的系统异常捕获器
        mDefaultCaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
        //把当前的crash捕获器设置成默认的crash捕获器
        Thread.setDefaultUncaughtExceptionHandler(this);
        mContext = context.getApplicationContext();
    }

    @Override
    public void uncaughtException(Thread thread, Throwable ex) {

        //注意需要清空所有已经启动的activity，否则你的错误提示框可能会弹出很多次
//        ActivityManager.getInstance().finishAllActivity();
//        SystemExit.finishAll();

        //启动错误处理页面，你也可以在这里写上传服务器什么的
        ex.printStackTrace();
        LogCook.d("--------程序崩了--------", Tool.getStackTrace(ex));
        Intent intent = mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName());
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
                Intent.FLAG_ACTIVITY_NEW_TASK);
        mContext.startActivity(intent);
        /*我看网上不少栗子是下面这么写的，但是实际测试的结果是，Android6.0以上的系统这么写没有任何问题，
        但如果是6.0以下的系统主线程异常这样写也没有问题，
        * 但如果6.0以下系统并且异常出现在子线程中，这么写就会执行系统那个丑陋的白色程序异常停止运行的提示框，
        * 然后点击确定后直接退出程序，不会运行你希望的友好退出界面*/
        if (mDefaultCaughtExceptionHandler != null) {
            mDefaultCaughtExceptionHandler.uncaughtException(thread, ex);
        } else {
            System.exit(0);
//          Process.killProcess(Process.myPid());//杀掉进程
        }
    }

}